#ifndef KERNELPROCESS_H
#define KERNELPROCESS_H


#include <objdetect.hpp>
#include <time.h>
#include <process.h>
#include <DbgHelp.h>
#include "Locate.h"
#include "RobotClient/robot.h"
#include "common.h"
//#include <cvwimage.h>
#include "atltime.h"


//extern int Flag;
class KernelProcess 
{
 //   Q_OBJECT
public:
    explicit KernelProcess();
public:
    int calc_tPc();//反算tPc
    Locate1 locate1;
    Locate2 locate2;
    Locate3 locate3;
    Locate4 locate4;
	Pose P_go1, P_go2, P_go3;
    Pose Ppre_go1,Ppre_go2;

    //预先标定号的数据，装配时候的偏移量
    //装配重合偏移量和接近位置偏移量参考详细注释文档
    Pose Pofs1[2];//第一次定位后的接近偏移量，[0]是装配重合偏移量，[1]是接近位置偏移量
    Pose Pofs2[2];//第一次定位后的接近偏移量，[0]是装配重合偏移量，[1]是接近位置偏移量

    CImage img;//当前的图像数据
    //相机手眼标定参数
    Pose tPc;
	Pose wPt = genPose(163.733, 1094.976, 1042.602
		,30.7608, 86.8575, 112.2250);//机器人当前位姿
	float cPoZ=0;

    Pose Poff1,Poff2;
    Pose PpreOff1,PpreOff2;

    Pose cPo1,cPo2;//第一次和第二次定位得到的cPo
    Pose cPo,cPo0;//当前迭代步骤和上次迭代步骤得到的物体在相机坐标系中的位姿
    Pose poseOb;//观察点位置，位于活塞正上方260mm


	



    //两次位姿计算的权重
    double w1[6],w2[6];

    //运动的位置
	Move moveAssembly[11];
    Move moveAssemblePiston[9];
    Move moveAssemblePeg[8];

    //机器人对象
//    Robot *rbt;
    bool isRobotMoving;
    //是否正确的定位
    bool isLocateCorrect;
    //是否正在调整位置
    bool isAdjusting;
    int numIterate;//迭代的次数

    //是否正在装配活塞
    bool isAssemblingPiston;
    //是否正在装配销子
    bool isAssemblingPeg;
//    CTimer *tmrAssembly;//用来控制装配步骤的定时器
    int stepAssemblePiston;//活塞当前装配步骤
    int stepAssemblePeg;//销子当前装配步骤

//signals:
//    void EndModelLoaded();
//    void locate_1_Complete(Pose);
//    void locate_2_Complete(Pose);
//    void Pgo1Calculated(Pose);
//    void Pgo2Calculated(Pose);
//
////    通知机器人线程控制机器人运动
//    void moveRobot(Move);
//    //输出信息
//    void log(QString msg);
//    //通知显示结果图像
////    void locateResult1(); v
//    void locateResult2();
//    void locateResult3();
//
//    //通知切换机器人手抓状态,0为open，1为close
//    void switchHand(int status);
//    //通知切换滑台夹具状态，0为open，1为close
//    void switchGripper(int status);
//
//    //通知切换连杆夹具状态，1为open，0为close
//    void switchVavle2(int status);
//    //void LocatePistonEnd();
//
//    void changeFlag();

public :
    //接收到图像数据
    void onImageReceive(CImage *img);
    //接收机器人位姿数据
    void onRobotPoseReceive(Pose p);
    //接收机器人运动信息（机器人是否在运动）
    void onIsRobotMoving(bool s);
    //接收UI过来的装配控制点信号
    void onAssemblyStep(int idx);
    //调整手抓的位姿
    void onAdjust();

    void onLoadModel();
    void onLocate_1();
    void onLocate_2();
    void onLocate_3();

    //控制滑台夹具开关
    void onSwitchGripper(int status);

    //控制连杆夹具开关
    void onSwitchVavle2(int status);
    //控制机器人夹具开关
    void onSwitchHand(int status);

    //抓取活塞后，控制机器人送活塞
    void onPbGoAssemblyPiston();
    //抓取销子后，控制机器人送销子
    void onPbGoAssemblyPeg();
    //抓取连杆后，放在台子上
    void onPbGoAssemblyLine();
    //Auto时抓取活塞送到夹具再抓取连杆，放在台子上
    int onPbGrabunion();
    //int onPbGrabPiston();
    /**
     * @brief 某进程finished槽函数
     * @param exitCode 进程退出代码
     */
    void processFinished(int exitCode);
    int onPbGrabtest();
public:
    ~KernelProcess()
	{}
//private slots:
//
//    //定时器，装配活塞
//    void onTmrAssemblePiston();
//    //定时器，装配销子
//    void onTmrAssemblePeg();
	void Pose_Togo(Pose P);
};

#endif // KERNELPROCESS_H
